//this file is part of notepad++
//Copyright (C)2003 Don HO <donho@altern.org>
//
//This program is free software; you can redistribute it and/or
//modify it under the terms of the GNU General Public License
//as published by the Free Software Foundation; either
//version 2 of the License, or (at your option) any later version.
//
//This program is distributed in the hope that it will be useful,
//but WITHOUT ANY WARRANTY; without even the implied warranty of
//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
//GNU General Public License for more details.
//
//You should have received a copy of the GNU General Public License
//along with this program; if not, write to the Free Software
//Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.

#include "PluginDefinition.h"
#include "menuCmdID.h"
#include "pluginConstants.h"

//
// The plugin data that Notepad++ needs
//
FuncItem funcItem[nbFunc];

//
// The data of Notepad++ that you can use in your plugin commands
//
NppData nppData;

//
// Initialize your plugin data here
// It will be called while plugin loading   
void pluginInit(HANDLE hModule)
{
	
}

//
// Here you can do the clean up, save the parameters (if any) for the next session
//
void pluginCleanUp()
{
}

//
// Initialization of your plugin commands
// You should fill your plugins commands here
void commandMenuInit()
{

    //--------------------------------------------//
    //-- STEP 3. CUSTOMIZE YOUR PLUGIN COMMANDS --//
    //--------------------------------------------//
    // with function :
    // setCommand(int index,                      // zero based number to indicate the order of command
    //            TCHAR *commandName,             // the command name that you want to see in plugin menu
    //            PFUNCPLUGINCMD functionPointer, // the symbol of function (function pointer) associated with this command. The body should be defined below. See Step 4.
    //            ShortcutKey *shortcut,          // optional. Define a shortcut to trigger this command
    //            bool check0nInit                // optional. Make this menu item be checked visually
    //            );
	
    // Create shortcut Alt-F
    ShortcutKey *shKey = new ShortcutKey;
    shKey->_isAlt = true;
    shKey->_isCtrl = false;
    shKey->_isShift = false;
    shKey->_key = 0x46; //VK_F

    // Bind shortcut to the first command
    setCommand(HELLO_IDX, TEXT("Hello Notepad++"), hello, shKey, false);

    // Add menu separator
    setCommand(SEP1_IDX, TEXT("---"), NULL, NULL, false);

    setCommand(ABOUT_IDX, TEXT("About"), aboutDlg, NULL, false);
}

//
// Here you can do the clean up (especially for the shortcut)
//
void commandMenuCleanUp()
{
	// Don't forget to deallocate your shortcut here
	delete funcItem[0]._pShKey;
}


//
// This function help you to initialize your plugin commands
//
bool setCommand(size_t index, TCHAR *cmdName, PFUNCPLUGINCMD pFunc, ShortcutKey *sk, bool check0nInit) 
{
    if (index >= nbFunc)
        return false;

    if (!pFunc)
        return false;

    lstrcpy(funcItem[index]._itemName, cmdName);
    funcItem[index]._pFunc = pFunc;
    funcItem[index]._init2Check = check0nInit;
    funcItem[index]._pShKey = sk;

    return true;
}

//----------------------------------------------//
//-- STEP 4. DEFINE YOUR ASSOCIATED FUNCTIONS --//
//----------------------------------------------//
void hello()
{
    // Get the current scintilla
    int which = -1;
    ::SendMessage(nppData._nppHandle, NPPM_GETCURRENTSCINTILLA, 0, (LPARAM)&which);
    if (-1 == which)
        return;
    HWND curScintilla = (which == 0)?nppData._scintillaMainHandle:nppData._scintillaSecondHandle;

    // Get current position
    LRESULT pos = ::SendMessage(curScintilla, SCI_GETCURRENTPOS, 0, 0);

    // Get the current clipboard text content
    if( ! (::OpenClipboard(curScintilla)))
        return;

    HGLOBAL clipboardData = ::GetClipboardData(CF_TEXT);
    SIZE_T clipLen = ::GlobalSize(clipboardData);  
    LPVOID clipStr = ::GlobalLock(clipboardData); 
    if (clipStr != NULL) { 
        GlobalUnlock(clipboardData);
    }
    ::CloseClipboard();

    char toPrint[MAX_PASTE_TEXT];
    memset(toPrint, 0, sizeof(toPrint));
    strcat(toPrint, "Hello ");
    strncat(toPrint, clipStr?(char*) clipStr:"", MAX_PASTE_TEXT-20);
    strcat(toPrint, " world!\n");

    // Scintilla control has no Unicode mode, so we use (char *) here
    ::SendMessage(curScintilla, SCI_INSERTTEXT, pos, (LPARAM)toPrint);

	// Move caret
	::SendMessage(curScintilla, SCI_GOTOPOS, pos + strlen(toPrint), 0);
}

void aboutDlg(){
    // Get the current scintilla
    int which = -1;
    ::SendMessage(nppData._nppHandle, NPPM_GETCURRENTSCINTILLA, 0, (LPARAM)&which);
    if (-1 == which)
        return;
    HWND curScintilla = (which == 0)?nppData._scintillaMainHandle:nppData._scintillaSecondHandle;

    ::MessageBox(curScintilla, TEXT("Developed by H. E. Pennypecker"), TEXT("Notepad++ Btol plugin"), MB_OK);
}
